package edu.pku.sei.mte.utilities;

import edu.pku.sei.mte.mtemodel.basictypes.BooleanType;
import edu.pku.sei.mte.mtemodel.basictypes.CollectionType;
import edu.pku.sei.mte.mtemodel.basictypes.IntegerType;
import edu.pku.sei.mte.mtemodel.basictypes.PrimitiveType;
import edu.pku.sei.mte.mtemodel.basictypes.StringType;
import edu.pku.sei.mte.mtemodel.core.Element;
import edu.pku.sei.mte.mtemodel.graph.Graph;
import edu.pku.sei.mte.mtemodel.graph.GraphEdge;
import edu.pku.sei.mte.mtemodel.graph.GraphNode;
import edu.pku.sei.mte.mtemodel.graph.GraphObject;
import edu.pku.sei.mte.mtemodel.graph.SubGraph;
import edu.pku.sei.mte.mtemodel.metamodel.RAttribute;
import edu.pku.sei.mte.mtemodel.metamodel.RTypeClass;
import edu.pku.sei.mte.mtemodel.metamodel.RTypeGraph;
import edu.pku.sei.mte.mtemodel.metamodel.RTypeReference;
import edu.pku.sei.mte.mtemodel.model.MAttribute;
import edu.pku.sei.mte.mtemodel.model.MClass;
import edu.pku.sei.mte.mtemodel.model.MModelGraph;
import edu.pku.sei.mte.mtemodel.model.MReference;
import edu.pku.sei.mte.mtemodel.mtmodel.ModelType;
import edu.pku.sei.mte.mtemodel.mtmodel.Transformation;
import edu.pku.sei.mte.mtemodel.mtmodel.common.Key;
import edu.pku.sei.mte.mtemodel.mtmodel.common.ModelVariable;
import edu.pku.sei.mte.mtemodel.mtmodel.common.Variable;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.AddExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.BindExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.CallRelationExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.CallRuleExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.ConstantExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.EqualExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.Expression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.InvokeMethodExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.NACExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.expression.PACExpression;
import edu.pku.sei.mte.mtemodel.mtmodel.pattern.TPatternEdge;
import edu.pku.sei.mte.mtemodel.mtmodel.pattern.TPatternGraph;
import edu.pku.sei.mte.mtemodel.mtmodel.pattern.TPatternNode;
import edu.pku.sei.mte.mtemodel.mtmodel.rulebased.Domain;
import edu.pku.sei.mte.mtemodel.mtmodel.rulebased.RBTransformation;
import edu.pku.sei.mte.mtemodel.mtmodel.rulebased.Relation;
import edu.pku.sei.mte.mtemodel.mtmodel.rulebased.Rule;

public interface Visitor {
	public Object visitElement(Element e);
	
	public Object visitPrimitiveType(PrimitiveType e);
	public Object visitStringType(StringType e);
	public Object visitIntegerType(IntegerType e);
	public Object visitBooleanType(BooleanType e);
	public Object visitCollectionType(CollectionType e);
	
	public Object visitGraph(Graph e);
	public Object visitGraphObject(GraphObject e);
	public Object visitSubGraph(SubGraph e);
	public Object visitGraphNode(GraphNode e);
	public Object visitGraphEdge(GraphEdge e);
	
	public Object visitRTypeGraph(RTypeGraph e);
	public Object visitRTypeClass(RTypeClass e);
	public Object visitRTypeReference(RTypeReference e);
	public Object visitRAttribute(RAttribute e);
	
	public Object visitMAttribute(MAttribute e);
	public Object visitMClass(MClass e);
	public Object visitMModelGraph(MModelGraph e);
	public Object visitMReference(MReference e);
	
	public Object visitKey(Key e);
	public Object visitVariable(Variable e);
	public Object visitModelVariable(ModelVariable e);
	
	public Object visitExpression(Expression e);
	public Object visitAddExpression(AddExpression e) throws Exception;
	public Object visitBindExpression(BindExpression e) throws Exception;
	public Object visitCallRelationExpression(CallRelationExpression e) throws Exception;
	public Object visitCallRuleExpression(CallRuleExpression e);
	public Object visitConstantExpression(ConstantExpression e);
	public Object visitEqualExpression(EqualExpression e) throws Exception;
	public Object visitInvokeMethodExpression(InvokeMethodExpression e) throws Exception;
	public Object visitNACExpression(NACExpression e) throws Exception;
	public Object visitPACExpression(PACExpression e) throws Exception;
	
	public Object visitTPatternEdge(TPatternEdge e);
	public Object visitTPatternGraph(TPatternGraph e);
	public Object visitTPatternNode(TPatternNode e);
	
	public Object visitTransformation(Transformation e) throws Exception;
	public Object visitModelType(ModelType e);
	public Object visitRule(Rule e);
	public Object visitRelation(Relation e) throws Exception;
	public Object visitRBTransformation(RBTransformation e) throws Exception;
	public Object visitDomain(Domain e);
}
